import SgMap from './sgmap/index';

const debug = true;
let impl = Symbol('impl');

/**
 * 地图开放顶层
 */
class Map {
  constructor(_) {
    this.options = _;
    // 工具集
    this.tools = {};
    // 当前使用的电网图层
    this._gridTool = null;
    // 初始化实现类
    this.initImpl();
    // 初始化地图
    this.initMap();
  }

  /**
   * 初始化实现类，根据options.base.type判断底层需要采用的实现方式
   */
  initImpl() {
    switch (this.options.base.type) {
      case 'sgmap':
        // 思极地图
        this[impl] = new SgMap(this.options);
        break;
      case 'emap':
        // 思极图行
        // impl = new EMap(this.options);
        break;
      default:
        console.log('invalid type');
        break;
    }
    if (debug) {
      this.impl = this[impl];
    }
  }

  /**
   * 初始化地图
   */
  initMap() {
    this[impl].initMap(this);
  }

  /**
   * 初始化地图辅助工具
   */
  start() {
    return new Promise((resolve) => {
      this.initConfig();
      this.initUtils();
      this.initEventEmitter();
      this.initTools();
      this.initApi();
      this.initImageList();
      this.initEvents();
      console.log('start', this);
      Promise.all([
        this.initStyleList(),
        this.initSblxList()
      ]).then(() => {
        resolve();
      });
    });
  }

  /**
   * 初始化参数配置
   */
  initConfig() {
    this[impl].initConfig(this, this.options.config);
  }

  /**
   * 初始化工具类
   */
  initUtils() {
    this[impl].initUtils(this);
  }

  /**
   * 初始化工具箱
   */
  initTools() {
    this[impl].initTools(this);
  }

  /**
   * 初始化服务接口
   */
  initApi() {
    this[impl].initApi(this, this.options.request);
  }

  /**
   * 初始化地图图标
   */
  initImageList() {
    this[impl].initImageList(this);
  }

  /**
   * 初始化地图事件方法
   */
  initEvents() {
    this[impl].initEvents(this);
  }

  initEventEmitter() {
    this[impl].initEventEmitter(this);
  }
  /**
   * 初始化电网式样
   */
  initStyleList() {
    return this[impl].initStyleList(this);
  }

  /**
   * 初始化设备类型
   */
  initSblxList() {
    return this[impl].initSblxList(this);
  }

  /**
   * 获取当前使用的电网图
   */
  getGridTool() {
    return this._gridTool;
  }
}

export default Map;
